﻿#region license
// Copyright (c) 2008 - 2008 Ritesh Rao
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
// 
//     * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//     * Neither the name of Ayende Rahien nor the names of its
//     contributors may be used to endorse or promote products derived from this
//     software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion

using System;
using System.Collections.Generic;
using NCommon;

namespace Rhinestone.Domain
{
    /// <summary>
    /// A project for which work items are created.
    /// </summary>
    public class Project
    {
        #region fields
        private int _projectID;
        private IUser _owner;
        private readonly ICollection<IUser> _members = new HashSet<IUser>();
        #endregion

        #region properties
        /// <summary>
        /// Gets the unique ID assigned to the project.
        /// </summary>
        /// <value>int. The unique ID assigned to the project.</value>
        public virtual int ProjectID
        {
            get {return _projectID;}
        }

        /// <summary>
        /// Gets or sets the user specified project code for the <see cref="Project"/> instance.
        /// </summary>
        /// <value>string. The user specified project code</value>
        public virtual string Code { get; set; }

        /// <summary>
        /// Gets or sets the name of the project.
        /// </summary>
        /// <value>string. The name of the project.</value>
        public virtual string Name { get; set; }

        /// <summary>
        /// Gets or sets a breif description about the project.
        /// </summary>
        /// <value>string. The breif description about the project.</value>
        public virtual string Description { get; set; }

        /// <summary>
        /// Gets a list of users that are memnbers of the project.
        /// </summary>
        /// <value>An <see cref="IEnumerable{T}"/> containing the list of users that are members of the project.</value>
        public virtual IEnumerable<IUser> Members
        {
            get {return _members;}
        }

        /// <summary>
        /// Gets a <see cref="IUser"/> that is the owner of the project.
        /// </summary>
        /// <value>The <see cref="IUser"/> that is the owner of the project.</value>
        public virtual IUser Owner
        {
            get { return _owner; }
            set
            {
                Guard.Against<ArgumentNullException>(value == null, "Cannot set a null IUser instance as the owner of a project.");
                _owner = value;
                AddMember(_owner);
            }
        } 
        #endregion

        #region methods
        /// <summary>
        /// Adds a user as a member of the <see cref="Project"/> instance.
        /// </summary>
        /// <param name="member">An <see cref="IUser"/> instance representing the user
        /// to add as a member of the project.</param>
        public void AddMember(IUser member)
        {
            Guard.Against<ArgumentNullException>(member == null, "Cannot add a null IUser instance ");
            _members.Add(member);
        } 
        #endregion
    }
}
